<?
class CBase extends CI_Controller {

	public function __construct() {
		parent::__construct();
		
		if ($this->_checaPaginaExcecao()) {
			$this->iniciaSessao();
			$this->_checaAutenticado();
			$this->_checaPermissao();
		}
	}
	
	
	/**
	 * inicia a sessao se ela ja nao estiver iniciada
	 */
	public function iniciaSessao() {
		if (!isset($_SESSION))
			session_start();
	}
	
	/**
	 * checa se o usuario esta autenticado
	 */
	private function _checaAutenticado() {
		if (!isset($_SESSION['usuario'])) {
			$_SESSION['url'] = current_url();
			redirect(site_url() . '/cautenticacao/', 'refresh');
		}
	}
	
	/**
	 * checa se o usuario tem permissao para acessar a pagina e o metodo
	 */
	private function _checaPermissao() {
	    $acesso1 = $this->router->fetch_class() . '/' . $this->router->fetch_method();
		$acesso2 = $this->router->fetch_class() . '/*';
		$acesso3 = '*';
		if (!in_array($acesso1, $_SESSION['usuario']->controlador_autorizado) && !in_array($acesso2, $_SESSION['usuario']->controlador_autorizado) && !in_array($acesso3, $_SESSION['usuario']->controlador_autorizado)) {
			redirect(site_url() . '/cusuario/semPermissao', 'refresh');
		}	
	}
	
	/**
	 * verifica se a pagina atual deve ser checada a autenticacao e permissao
	 * 
	 * @return boolean (true - deve ser checada)
	 */
	private function _checaPaginaExcecao() {
		$lista_excecao[] = 'cautenticacao/index';
		$lista_excecao[] = 'cautenticacao/formLogin';
		$lista_excecao[] = 'cautenticacao/login';
		$lista_excecao[] = 'cautenticacao/formEsqueciSenha';
		$lista_excecao[] = 'cautenticacao/ajaxValidarCadastrado';
		$lista_excecao[] = 'cautenticacao/ajaxEmailCodigo';
		$lista_excecao[] = 'cautenticacao/alterarSenhaEmail';
		$lista_excecao[] = 'cautenticacao/sair';
		$lista_excecao[] = 'cusuario/semPermissao';

	    $acesso[] = $this->router->fetch_class() . '/' . $this->router->fetch_method();
        $acesso[] = $this->router->fetch_class() . '/*';

        foreach ($acesso as $tmp_acesso) {
            if (in_array($tmp_acesso, $lista_excecao)) return false;
        }
		
        return true;
	}
	
	/**
	 * busca utilizada na lib autocomplete
	 * 
	 * @param string $classe: nome da entidade
	 * @param string $campo: nome do campo que sera mostrado, o id sera o primary key da tabela
	 */	
	public function buscaAutoComplete($classe, $campo) {
		$retorno['query'] = $this->input->get('query');
		$retorno['suggestions'] = '';
		$retorno['data'] = '';
		
		if ($retorno['query']) {
			$confirmar = $this->input->get('confirmar');
			$obj = new $classe;
			if ($confirmar)
				$obj->{$obj->__dm['primaria']} = $retorno['query'];
			else
				$obj->$campo = $retorno['query'] . '%';
			$resultado = $obj->recuperar();

			if (count($resultado)) {
				foreach ($resultado as $tmp) {
					$retorno['data'][] = $tmp->{$obj->__dm['primaria']};
					$retorno['suggestions'][] = $tmp->$campo;
				}
			}
		}

		echo json_encode($retorno);
	}
	
	/**
	 * monta a listagem de erro do validate
	 * 
	 * @param array $lista: lista dos erros retornado pelo validate
	 * 
	 * @return string
	 */
	public function validateErro($lista) {
		$this->lang->load('validate');
		$html = '<ul class="error">';
		foreach ($lista as $campo => $valor) {
			if ($valor == false) {
				$msg = $this->lang->line($campo);
				$html .= '<li>' . ($msg ? $msg : "Campo $campo inv&aacute;lido") . '</li>';
			}
		}
		$html .= '</ul>';
		return $html;
	}
}
